#们把变量从内存中变成可存储或传输的过程称之为序列化
d = dict(name = 'bob',ago = 20,score = 90)
#Python提供了pickle模块来实现序列化。
import pickle
f = pickle.dumps(d)
print(f)

#方法pickle.dump()直接把对象序列化后写入一个file-like Object
t = open('E:/python/dump.txt','wb')
pickle.dump(d,t)
t.close()
print(d)

#用pickle.load()方法从一个file-like Object中直接反序列化出对象
f = open('E:/python/dump.txt','rb')
d = pickle.load(f)
f.close()
print(d)

#如果我们要在不同的编程语言之间传递对象，就必须把对象序列化为标准格式
#Python内置的json模块提供了非常完善的Python对象到JSON格式的转换
import json
d = dict(name = 'bob',ago = 20,score = 90)
print(json.dumps(d))
#dumps()方法返回一个str，内容就是标准的JSON。
#类似的，dump()方法可以直接把JSON写入一个file-like Object

#要把JSON反序列化为Python对象，用loads()或者对应的load()方法
#前者把JSON的字符串反序列化，后者从file-like Object中读取字符串并反序列化：
str1 = '{"name": "bob", "ago": 20, "score": 90}'
print(json.loads(str1))


#class表示对象
#可选参数default就是把任意一个对象变成一个可序列为JSON的对象
#我们只需要为Student专门写一个转换函数，再把函数传进去即可：
import json
class Student(object):
    def __init__(self,name,age,score):
        self.name = name
        self.age = age
        self.score = score
    
def Student_dict(std):
    return{
        'name':std.name,
        'age':std.age,
        'score':std.score
    }

s = Student('Bob',20,90)
print(json.dumps(s,default=Student_dict))

#我们可以偷个懒，把任意class的实例变为dict
#因为通常class的实例都有一个__dict__属性，它就是一个dict，用来存储实例变量。
#也有少数例外，比如定义了__slots__的class
print(json.dumps(s, default=lambda obj: obj.__dict__))

#如果我们要把JSON反序列化为一个Student对象实例
#loads()方法首先转换出一个dict对象
#然后，我们传入的object_hook函数负责把dict转换为Student实例
def dict_Student(d):
    return Student(d['name'],['age'],['score'])
a = '{"name": "Bob", "age": 20, "score": 90}'

print(json.loads(a,object_hook=dict_Student))